//
//  main.m
//  04-集合(二)NSDictionary
//
//  Created by LL.F on 16/7/7.
//  Copyright © 2016年 LL.F. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Contact.h"
#import "ContactManager.h"
int main(int argc, const char * argv[]) {
    
#if 0
    /******************** 一.字典 ********************/
    // 1. 不可变字典: 存储键值对(key-value)的集合类型, 字典中存储数据没有顺序, 通过key值存储和查询value
    // 1) 初始化-> initWithObjects:value, key, value, key
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"李四", @"name", @"李四", @"fullName", [NSNumber numberWithInt:22], @"age", nil];
    // 字典中只能存放对象类型(NSObject的子类)
    // 2) 构造器
    NSDictionary *diction = [NSDictionary dictionaryWithObjectsAndKeys:@"李四", @"name", [NSNumber numberWithInt:22], @"age", nil];
    // 3) 字面量  @{key: value, key: value} 字符串 @"" 数值对象类型NSNumber @() 数组 @[]
    NSDictionary *dictionary = @{@"name": @"李四", @"age": @"22", @"height": @(165.5)};//@(165.5)是基本数值类型, 当数值是正整数时()可以省略,即@23, @(-23).又有一种说法:将int,double等基本数据类型直接转换就是在前面加@，如果是变量就用()将变量括起来
    // 4) 取值
    // <1> 通过key取value
    NSString *name = [dictionary objectForKey:@"name"];
    NSLog(@"%@", name);
    // <2> 获取所有的key
    NSArray *allKeys = dictionary.allKeys;
    // <3> 获取所有的value
    NSArray *allValues = dictionary.allValues;
    // <4> count
    NSUInteger count = dictionary.count;
    // <5> 通过一个数组，取到对应数组的Value
    NSArray *allValueArray = [dictionary objectsForKeys:allKeys notFoundMarker:[NSString class]];//第一个参数是一个数组
    NSLog(@"%@", allValueArray);
    // <6> 通过一个对象, 查找所有value是这个对象的所有key
    NSArray *array = [dic allKeysForObject:@"李四"];
    NSLog(@"%@", array);
    // <7> 语法糖取值 数组中arr[下标] 字典中dic[key]
    NSLog(@"%@", dic[@"name"]);
    
    // 2. 可变字典 NSMutableDictionary
    // 1) 初始化方式与不可变字典基本相同(不推荐使用字面量)
    NSMutableDictionary *mutableDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"韩旭", @"name", @18, @"age", nil];
    // 2) 字面量(不推荐使用字面量)
    NSMutableDictionary *mutablediction = [@{} mutableCopy];
    // 3) 取值 与不可变字典相同
    // 4) 增 删 改
    // <1> 添加 修改 setObject:value forKey:key
    //     如果key已经存在, 会将之前的value覆盖, 如果key不存在, 会直接添加
    // 注意: 字典中的key不要重复, 如果重复, 会以最后的value进行赋值
    [mutableDic setObject:@"王五" forKey:@"name"];
    NSLog(@"%@", mutableDic);
    // <2> 删除
    [mutableDic removeObjectForKey:@"name"];
    [mutableDic removeAllObjects];
    [mutableDic removeObjectsForKeys:@[@"name", @"age"]];
    // <3> 语法糖 与setObject: forKey: 相同
    mutableDic[@"name"] = @"李成";
#endif
    
#if 1
    /******************** 二.集合 ********************/
    // 不可变 NSSet 可变 NSMutableSet
    // 1. 初始化
    // 集合会删除掉重复的内容(互异性)
    // 要删除数组或者字典中重复的内容, 放入集合中
    NSSet *set = [[NSSet alloc] initWithObjects:@"韩旭", @"韩旭", @"豆包", nil];
    NSLog(@"%@", set);
    // 2. 构造器
    NSSet *setObject = [NSSet setWithObjects:@"韩旭", @"韩旭", nil];
    // 3. 没有提供字面量形式
    
    // 4.取值
    // <1> 从集合中取出任意元素
    [set anyObject];
    // <2> count
    NSUInteger setCount = set.count;
    NSLog(@"%ld", setCount);
    // <3> 集合去重 (删除掉数组中重复的元素)
    NSArray *repeatArray = @[@10, @20, @10, @30, @100, @10];
    NSSet *repeatSet = [[NSSet alloc] initWithArray:repeatArray];
    repeatArray = repeatSet.allObjects;
    NSLog(@"%@", repeatArray);//结果只有 10 20 30 100实现了把数组中重复的地方去掉
    
    // 可变集合 NSMutableSet
    // 1. 初始化与不可变集合一样
    // 2. 取值 anyObject
    // 3. 可变集合 可变性
    NSMutableSet *mutableSet = [NSMutableSet set];
    //添加
    [mutableSet addObject:@"aa"];
    //移除
    [mutableSet removeObject:@"aa"];
    [mutableSet removeAllObjects];
#endif
    
#if 1
    // 完成以下需求
    //   需求:
    //1、定义联系人类Contact 。实例变量:姓名(拼音, 首字母大写)、性别、电话号码、住址、分组名称、年龄。 方法:自定义初始化方法(姓名、电话号码)、显示联系人信息。
    //2、在main.m中定义字典,分组管理所有联系人。分组名为26个大写的英文字母。
    //3、可以添加联系人对象,如果姓名或电话号码为空,添加失败。添加联系人到匹配的分组。
    //4、删除某个分组的全部联系人。
    
    Contact *contact = [[Contact alloc] initWithName:@"小李" phoneNumber:@"110"];
    contact.groupName = @"L";
    [contact showContact];
    
    NSMutableDictionary *contactDictionary = [NSMutableDictionary dictionary];
    // key: A~Z value: NSMutableArray
    //判断名字和手机号是不是空值
    if (contact.name.length > 0 && contact.phoneNumber.length > 0) {
        //都不是空值, 可以添加
        //通过联系人的分组名, 取到对应的分组数组
        NSMutableArray *contactArr = [contactDictionary objectForKey:contact.groupName];
        //判断数组是否存在, 不存在创建
        if (contactArr == nil) {
            contactArr = [NSMutableArray array];
            [contactArr addObject:contact];
            [contactDictionary setObject:contactArr forKey:contact.groupName];
        } else {
        //数组存在,直接添加
            [contactArr addObject:contact];
        }
        NSLog(@"添加%@联系人成功", contact.name);
    //否则添加失败
    } else {
        NSLog(@"添加失败");
    }
#endif
    
#if 0
    //上题写成了联系人管理系统 建了一个ContactManager类
    Contact *contact = [[Contact alloc] initWithName:@"小李" phoneNumber:@"110"];
    contact.groupName = @"X";
    [contact showContact];
    
    Contact *contact1 = [[Contact alloc] initWithName:@"李武" phoneNumber:@"110"];
    contact1.groupName = @"L";
    
    Contact *contact2 = [[Contact alloc] initWithName:@"王二" phoneNumber:@"111"];
    contact2.groupName = @"W";
    
    Contact *contact3 = [[Contact alloc] initWithName:@"白雪" phoneNumber:@"114"];
    contact3.groupName = @"B";
    
    Contact *contact4 = [[Contact alloc] initWithName:@"王松" phoneNumber:@"110"];
    contact4.groupName = @"W";
    
    NSMutableDictionary *contactDictionary = [NSMutableDictionary dictionary];

    ContactManager *contactManager = [[ContactManager alloc] initWithDictionary:contactDictionary];
    
    [contactManager addContact:contact1];
    [contactManager addContact:contact2];
    [contactManager addContact:contact3];
    [contactManager addContact:contact4];
    NSLog(@"%@", contactManager.contactDictionary);
#endif
    
    return 0;
}
